5.19. Первая программа
Первая программа
Установка необходимых компонентов
Для работы с Elixir требуется два основных компонента: сам язык Elixir и среда выполнения Erlang/OTP. Они распространяются отдельно, но совместимы между собой в рамках определённых версий. Официальный сайт Elixir (https://elixir-lang.org) содержит актуальные рекомендации по совместимости.
Шаг 1. Установка Erlang/OTP
Erlang/OTP — это платформа, на которой исполняется код Elixir. Без неё Elixir работать не может. Установка зависит от операционной системы.
На macOS
Рекомендуемый способ — использовать менеджер пакетов Homebrew:
brew install erlang
На Ubuntu или Debian
Добавьте официальный репозиторий Erlang Solutions, чтобы получить актуальную версию:
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update
sudo apt install erlang
На Windows
Скачайте установщик с официального сайта Erlang (https://www.erlang.org/downloads). Выберите версию, совместимую с последней стабильной версией Elixir. Установщик добавит Erlang в систему и настроит переменные окружения.
После установки проверьте, что Erlang доступен:
erl -version
Команда должна вывести номер версии, например: Erlang/OTP 26.
Шаг 2. Установка Elixir
Теперь можно установить сам Elixir.
На macOS
Через Homebrew:
brew install elixir
На Ubuntu или Debian
После установки Erlang:
sudo apt install elixir
На Windows
Скачайте установщик с https://elixir-lang.org/install.html. Он автоматически определит наличие Erlang и завершит настройку.
Проверьте установку:
elixir --version
Вывод будет содержать версии Elixir и Erlang, например:
Elixir 1.17.0 (compiled with Erlang/OTP 26)
Это означает, что система готова к работе.
Запуск интерактивной оболочки
Elixir предоставляет интерактивную оболочку под названием IEx (Interactive Elixir). Это мощный инструмент для экспериментов, отладки и изучения языка.
Запустите её командой:
iex
Вы увидите приглашение вида:
Erlang/OTP 26 [erts-14.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
Interactive Elixir (1.17.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
Теперь можно выполнять любые выражения на Elixir. Например, введите:
"Hello, World!"
Оболочка сразу выведет результат:
"Hello, World!"
Это строка, но она не была напечатана в терминале — она просто возвращена как значение. Чтобы действительно вывести текст на экран, используйте функцию IO.puts/1:
IO.puts("Hello, World!")
Результат:
Hello, World!
:ok
Функция IO.puts/1 выводит строку и возвращает атом :ok, что означает успешное завершение операции. Это стандартная практика в экосистеме Erlang/Elixir — многие функции возвращают кортежи вида {:ok, result} или {:error, reason}, но в простых случаях используется атом :ok.
Нажмите Ctrl+C дважды, чтобы выйти из IEx.
Написание первой программы в файле
Хотя IEx удобен для быстрых экспериментов, реальные программы пишутся в файлах. Создадим скрипт, который при запуске выводит «Hello, World!».
Шаг 1. Создание файла
Откройте текстовый редактор и создайте файл с именем hello.exs. Расширение .exs означает «Elixir script» — такой файл предназначен для однократного выполнения, а не для компиляции в модуль.
Добавьте в него следующее содержимое:
IO.puts("Hello, World!")
Сохраните файл.
Шаг 2. Запуск скрипта
В терминале перейдите в каталог, где находится файл, и выполните:
elixir hello.exs
Вывод:
Hello, World!
Программа завершилась. Это самый простой способ запуска Elixir-кода без создания полноценного проекта.
Обратите внимание: файл с расширением .exs не компилируется в байт-код BEAM, а интерпретируется на лету. Это делает его идеальным для небольших задач, автоматизации или обучения.
Создание полноценного проекта с помощью Mix
Для более сложных приложений используется инструмент Mix — стандартный менеджер сборки и управления проектами в экосистеме Elixir. Он генерирует структуру проекта, управляет зависимостями, компилирует код и запускает тесты.
Шаг 1. Генерация нового проекта
Выполните команду:
mix new hello_world
Mix создаст каталог hello_world со следующей структурой:
hello_world/
├── lib/
│ └── hello_world.ex
├── test/
│ └── hello_world_test.exs
├── .formatter.exs
├── mix.exs
└── README.md
Основной файл программы — lib/hello_world.ex. По умолчанию он содержит модуль с примером функции:
defmodule HelloWorld do
@moduledoc """
Documentation for `HelloWorld`.
"""
@doc """
Hello world.
## Examples
iex> HelloWorld.hello()
:world
"""
def hello do
:world
end
end
Этот код определяет модуль HelloWorld с функцией hello/0, возвращающей атом :world.
Шаг 2. Изменение программы
Отредактируйте файл lib/hello_world.ex, чтобы он выводил «Hello, World!» при запуске. Однако важно понимать: модуль сам по себе ничего не делает — он лишь определяет поведение. Чтобы что-то вывести, нужно вызвать функцию.
Создадим новую функцию, которая печатает приветствие:
defmodule HelloWorld do
def greet do
IO.puts("Hello, World!")
end
end
Теперь нужно запустить эту функцию. Для этого можно воспользоваться IEx в контексте проекта.
Шаг 3. Запуск в IEx
Перейдите в каталог проекта:
cd hello_world
Запустите IEx с подключением к проекту:
iex -S mix
Флаг -S mix означает: «запусти IEx, предварительно выполнив mix для загрузки зависимостей и компиляции кода».
Теперь в оболочке доступен модуль HelloWorld. Вызовите функцию:
HelloWorld.greet()
Результат:
Hello, World!
:ok
Программа работает.
Шаг 4. Создание исполняемой точки входа
Если требуется запускать программу как самостоятельный скрипт (без входа в IEx), можно создать файл lib/hello_world/cli.ex:
defmodule HelloWorld.CLI do
def main(_args) do
HelloWorld.greet()
end
end
Затем укажите эту функцию как точку входа в файле mix.exs. Найдите секцию project и добавьте параметр escript:
def project do
[
app: :hello_world,
version: "0.1.0",
elixir: "~> 1.17",
start_permanent: Mix.env() == :prod,
escript: [main_module: HelloWorld.CLI],
deps: deps()
]
end
Теперь соберите исполняемый файл:
mix escript.build
Эта команда создаст файл hello_world в корне проекта. Запустите его:
./hello_world
Вывод:
Hello, World!
Теперь у вас есть полностью автономная программа на Elixir, которую можно запускать из командной строки.